﻿Imports Capa_de_Acceso_a_Datos

Public Class frmConsultarPresentaciones

    Public FarmaciaId As Integer
    Private vistaPresentaciones As DataView
    Public totales(2) As Double

    'Usado para la llamada desde el form CargaCaratulas
    Public PantallaLlamada As String
    Public AnoId As Integer
    Public MesId As Integer
    Public PresentacionId As Integer
    Public ObraSocialXPlanId As Integer

    Private Sub frmConsultarPresentaciones_FormClosed(ByVal sender As Object, ByVal e As System.Windows.Forms.FormClosedEventArgs) Handles Me.FormClosed
        Me.Dispose()
    End Sub

    Public Sub SeleccionarPresentacion()                
        txtFarmacia.Text = FarmaciaDAO.obtenerFarmacias(FarmaciaId).Rows(0)("FarmaciaNombre")
        cboAno.SelectedValue = AnoId
        cboMes.SelectedValue = MesId
        cboObraSocial.SelectedValue = ObraSocialXPlanId
        btnBuscarPresentaciones_Click(Nothing, Nothing)

        'SIGUE

    End Sub

    Private Sub frmConsulta_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load

        With dgvPresentaciones
            ' alternar color de filas  
            .AlternatingRowsDefaultCellStyle.BackColor = Color.FloralWhite
            .DefaultCellStyle.BackColor = Color.Beige
        End With

        CargarCombos()    
        
    End Sub

    Private Sub CargarCombos()
        'Combo Año
        cboAno.ValueMember = "AnoId"
        cboAno.DisplayMember = "Ano"
        cboAno.DataSource = Constante.comboFiltroAno

        'Combo Mes 
        cboMes.ValueMember = "MesId"
        cboMes.DisplayMember = "MesNombre"
        cboMes.DataSource = Constante.comboFiltroMes
        cboMes.SelectedValue = 0

        'Combo ObraSocialXPlan
        cboObraSocial.ValueMember = "ObraSocialXPlanId"
        cboObraSocial.DisplayMember = "Descripcion"
        cboObraSocial.DataSource = Constante.comboFiltroObraSocial
        cboObraSocial.SelectedValue = 0

    End Sub

    Private Sub btnBuscar_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnBuscar.Click
        frmSeleccionarFarmacia.frmLlamada = Me.Name
        frmSeleccionarFarmacia.ShowDialog()
    End Sub

    Private Sub btnBuscarPresentaciones_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnBuscarPresentaciones.Click
        'If txtFarmacia.Text = "" Then
        '    MsgBox("La farmacia es un dato requerido", MsgBoxStyle.Information, "Atención")
        '    Return
        'End If

        gboPresentaciones.Enabled = True        

        CargarGrilla()

    End Sub

    Private Sub CargarGrilla()
        vistaPresentaciones = PresentacionDAO.obtenerPresentacionConJoin.DefaultView
        FiltrarGrilla()
        dgvPresentaciones.DataSource = vistaPresentaciones
        dgvPresentaciones.Refresh()
        dgvPresentaciones.Columns("PresentacionId").Visible = False

        dgvPresentaciones.Columns("FarmaciaNombre").HeaderText = "Farmacia"
        dgvPresentaciones.Columns("PresentacionAno").HeaderText = "Año"
        dgvPresentaciones.Columns("MesNombre").HeaderText = "Mes"
        dgvPresentaciones.Columns("EstadoPresentacionNombre").HeaderText = "Estado"
        dgvPresentaciones.Columns("Descripcion").HeaderText = "Obra Social"

        dgvPresentaciones.Columns("EstadoPresentacionNombre").Width = 140
        dgvPresentaciones.Columns("Descripcion").Width = 135
        dgvPresentaciones.Columns("FarmaciaNombre").Width = 135
        dgvPresentaciones.Columns("PresentacionAno").Width = 40
        dgvPresentaciones.Columns("MesNombre").Width = 70
    End Sub

    Private Sub FiltrarGrilla()
        'Creamos el filtro para aquellos datos que comienzan con los textos buscados
        Dim Descripcion As String = cboObraSocial.Text
        Dim Ano As String = cboAno.Text
        Dim Mes As String = cboMes.Text
        Dim Farmacia As String = txtFarmacia.Text

        If cboObraSocial.SelectedValue = 0 Then
            Descripcion = ""
        End If

        If cboMes.SelectedValue = 0 Then
            Mes = ""
        End If

        Dim filtro As String = "Descripcion LIKE '%" & Descripcion & "%'" & " And PresentacionAno = " & Ano & " And MesNombre Like '%" & Mes & "%' And FarmaciaNombre Like '%" & Farmacia & "%'"

        'Filtramos el listado de farmacias y cargamos la grilla nuevamente
        vistaPresentaciones.RowFilter = filtro

    End Sub

    Private Sub ItemVisualizacion_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles ItemVisualizacion.Click
        VisualizarPresentacion()
    End Sub

    Private Sub dgvPresentaciones_DoubleClick(ByVal sender As Object, ByVal e As System.EventArgs) Handles dgvPresentaciones.DoubleClick
        VisualizarPresentacion()
    End Sub

    Private Sub VisualizarPresentacion()
        Dim PresentacionId As Integer

        If dgvPresentaciones.SelectedRows.Count > 0 Then
            PresentacionId = dgvPresentaciones.SelectedRows(0).Cells("PresentacionId").Value
            frmVisualizarPresentacion.txtFarmacia.Text = dgvPresentaciones.SelectedRows(0).Cells("FarmaciaNombre").Value
            frmVisualizarPresentacion.txtEstado.Text = dgvPresentaciones.SelectedRows(0).Cells("EstadoPresentacionNombre").Value
            frmVisualizarPresentacion.txtAno.Text = dgvPresentaciones.SelectedRows(0).Cells("PresentacionAno").Value
            frmVisualizarPresentacion.txtMes.Text = dgvPresentaciones.SelectedRows(0).Cells("MesNombre").Value
            frmVisualizarPresentacion.txtOS.Text = dgvPresentaciones.SelectedRows(0).Cells("Descripcion").Value
            frmVisualizarPresentacion.PresentacionId = dgvPresentaciones.SelectedRows(0).Cells("PresentacionId").Value
            frmVisualizarPresentacion.ShowDialog()
        Else
            MsgBox("Seleccione primero una presentación", MsgBoxStyle.Information, "Atención")
        End If
    End Sub

    Private Sub btnSalir_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnSalir.Click
        Me.Dispose()
    End Sub

    Private Sub btnAbrir_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnAbrir.Click
        'Si hay una fila seleccionada 
        If dgvPresentaciones.SelectedRows.Count > 0 Then
            Dim PresentacionId As Integer = dgvPresentaciones.SelectedRows(0).Cells("PresentacionId").Value

            'Si la presentación está cerrada 
            If PresentacionCerrada(PresentacionId) Then
                'Actualizo el estado de la presentación a pendiente de auditoría
                ActualizarEstadoPresentacion(PresentacionId, EstadoPresentacionDAO.PENDIENTE_AUDITORIA)

                'Obtengo la carátula intermedia de la presentación
                'que se generó cuando se cerró y la elimino
                Dim CaratulaPresentacionId As Integer = CaratulaPresentacionDAO.obtenerIntermediaXPresentacion(PresentacionId).Rows(0)("CaratulaPresentacionId")
                CaratulaPresentacionDAO.eliminarCaratulaPresentacion(CaratulaPresentacionId)
                CargarGrilla()
                MsgBox("La presentación ha sido abierta exitosamente", MsgBoxStyle.Information, "Atención")
            Else
                MsgBox("Solamente pueden abrirse las presentaciones cuyo estado es cerrado", MsgBoxStyle.Information, "Atención")
            End If
        Else
            MsgBox("Seleccione primero una presentación", MsgBoxStyle.Information, "Atención")
        End If

    End Sub



    Private Sub btnCerrar_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnCerrar.Click
        'Si hay una presentación seleccionada 
        If dgvPresentaciones.SelectedRows.Count > 0 Then
            Dim PresentacionId As Integer = dgvPresentaciones.SelectedRows(0).Cells("PresentacionId").Value
            'Si la presentación esta pendiente de auditoría
            If PresentacionPendienteAuditoria(PresentacionId) Then                
                ActualizarEstadoPresentacion(PresentacionId, EstadoPresentacionDAO.CERRADA)
                'Calculos la cantidad de recetas, total facturado y a cargo de la presentación
                CalcularTotales(PresentacionId)

                'Cargamos los datos en la pantalla de ingreso de bonificación
                Dim ObraSocialXPlanId As Integer = PresentacionDAO.obtenerPresentaciones(PresentacionId).Rows(0)("ObraSocialXPlanId")
                Dim ObraSocialId As Integer = ObraSocialXPlanDAO.obtenerObrasSocialesXPlanes(ObraSocialXPlanId).Rows(0)("ObraSocialId")
                Dim ObraSocialNombre As String = ObraSocialDAO.obtenerObraSociales(ObraSocialId).Rows(0)("ObraSocialNombre")

                frmIngresarBonificacion.txtObraSocial.Text = ObraSocialNombre
                frmIngresarBonificacion.txtFarmacia.Text = dgvPresentaciones.SelectedRows(0).Cells("FarmaciaNombre").Value

                'Cargamos los datos que va a mostrar el reporte
                frmCierrePresentacion.PresentacionId = PresentacionId
                frmCierrePresentacion.ObraSocialXPlan = dgvPresentaciones.SelectedRows(0).Cells("Descripcion").Value
                frmCierrePresentacion.Farmacia = dgvPresentaciones.SelectedRows(0).Cells("FarmaciaNombre").Value
                frmCierrePresentacion.Ano = dgvPresentaciones.SelectedRows(0).Cells("PresentacionAno").Value
                frmCierrePresentacion.Mes = dgvPresentaciones.SelectedRows(0).Cells("MesNombre").Value
                frmCierrePresentacion.Recetas = totales(0)
                frmCierrePresentacion.Facturado = totales(1)
                frmCierrePresentacion.ACargo = totales(2)

                frmIngresarBonificacion.ShowDialog()
                CargarGrilla()
            Else
                MsgBox("La presentación ya fue cerrada", MsgBoxStyle.Information, "Atención")
            End If

        Else
            MsgBox("Seleccione primero una presentación", MsgBoxStyle.Information, "Atención")
        End If

    End Sub

    Private Sub registrarMovimiento(ByVal PresentacionId As Integer)
        Dim caratulas As DataTable = CaratulaPresentacionDAO.obtenerCaratulasXPresentacion(PresentacionId)
        Dim fila As DataRow
        Dim caratulaFarmacia As Double = 0
        Dim caratulaIntermedia As Double = 0
        Dim ajuste As Double = 0
        'TipoMovimiento = Ajuste por auditoría CA.FA.PRO.
        Dim TipoAjuste As Integer = 5
        For Each fila In caratulas.Rows
            'si es original
            If fila("TipoCaratulaId") = 1 Then
                caratulaFarmacia = CDbl(fila("CaratulaPresentacionTotalCobrar").ToString())
            Else
                'si es caratula intermedia
                If fila("TipoCaratulaId") = 2 Then
                    caratulaIntermedia = CDbl(fila("CaratulaPresentacionTotalCobrar").ToString())
                End If
            End If
            ajuste = caratulaFarmacia - caratulaIntermedia
        Next
        If ajuste > 0 Then
            CuentaCorrienteDAO.CuentaCorrienteInsertarMovimiento(FarmaciaId, TipoAjuste, 0, ajuste, Today, "Cierre de presentacion " & dgvPresentaciones.SelectedRows(0).Cells("Descripcion").Value)
        Else
            CuentaCorrienteDAO.CuentaCorrienteInsertarMovimiento(FarmaciaId, TipoAjuste, ajuste, 0, Today, "Cierre de presentacion " & dgvPresentaciones.SelectedRows(0).Cells("Descripcion").Value)
        End If


    End Sub

    Private Sub ActualizarEstadoPresentacion(ByVal PresentacionId As Integer, ByVal EstadoId As Integer)
        Dim tablaPresentacion As DataTable = PresentacionDAO.obtenerPresentaciones(PresentacionId)

        Dim PresentacionFecha As Date = tablaPresentacion.Rows(0)("PresentacionFecha")
        Dim PresentacionAno As Integer = tablaPresentacion.Rows(0)("PresentacionAno")
        Dim MesId As Integer = tablaPresentacion.Rows(0)("MesId")
        Dim ObraSocialXPlanId As Integer = tablaPresentacion.Rows(0)("ObraSocialXPlanId")
        Dim FarmaciaId As Integer = tablaPresentacion.Rows(0)("FarmaciaId")
        Dim EmpleadoRecepcionId As Integer = tablaPresentacion.Rows(0)("EmpleadoRecepcionId")
        'Dim EmpleadoAuditorId As String = tablaPresentacion.Rows(0)("EmpleadoAuditorId")
        'Estado cerrada
        Dim EstadoPresentacionId As Integer = EstadoId

        PresentacionDAO.actualizarPresentacion(PresentacionId, PresentacionFecha, PresentacionAno, MesId, EstadoPresentacionId, FarmaciaId, ObraSocialXPlanId, EmpleadoRecepcionId)
        dgvPresentaciones.Refresh()
    End Sub

    Private Sub CalcularTotales(ByVal PresentacionId As Integer)

        If ObraSocialAdmiteDetalle(PresentacionId) Then

            Dim tablaRecetas As DataTable = RecetaDAO.obtenerRecetasDePresentacionNoExcluidas(PresentacionId)
            Dim tablaDetalleRecetas As DataTable
            Dim RecetaId As Integer
            Dim Precio As Double
            Dim Cantidad As Integer
            Dim FacturadoDetalle As Double
            Dim PorcentajeCobertura As Double
            Dim ACargo As Double

            'Cantidad de recetas de la presentación 
            totales(0) = tablaRecetas.Rows.Count
            totales(1) = 0
            totales(2) = 0

            'Si hay recetas cargadas para la presentación
            If Not totales(0) = 0 Then

                For Each fila As DataRow In tablaRecetas.Rows
                    RecetaId = fila("RecetaId")
                    tablaDetalleRecetas = DetalleRecetaDAO.obtenerDetalleRecetaXReceta(RecetaId)

                    For Each row As DataRow In tablaDetalleRecetas.Rows
                        Precio = row("DetalleRecetaPrecioHistorico")
                        Cantidad = row("DetalleRecetaCantidad")
                        FacturadoDetalle = Precio * Cantidad
                        'Total facturado de la presentación
                        totales(1) = totales(1) + FacturadoDetalle

                        PorcentajeCobertura = row("DetalleRecetaPorcentajeCobertura")
                        ACargo = FacturadoDetalle * (PorcentajeCobertura / 100)
                        'Total a cargo de OS de la presentación
                        totales(2) = totales(2) + ACargo
                    Next
                Next

            End If

        Else
            'La obra social de la presentación no admite detalle, por lo tanto hay que buscar su carátula intermedia
            'para obtener la cantidad de recetas, total facturado y a cargo
            'Cantidad de recetas de la presentación 
            Dim CaratulaIntermedia As DataTable = CaratulaPresentacionDAO.obtenerIntermediaXPresentacion(PresentacionId)

            totales(0) = CaratulaIntermedia.Rows(0)("CaratulaPresentacionRecetas")
            totales(1) = CaratulaIntermedia.Rows(0)("CaratulaPresentacionTotalFacturado")
            totales(2) = CaratulaIntermedia.Rows(0)("CaratulaPresentacionTotalCobrar")

        End If
        registrarMovimiento(PresentacionId)

    End Sub

    Private Sub btnCargarRecetas_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnCargarRecetas.Click

        If dgvPresentaciones.SelectedRows.Count > 0 Then
            Dim PresentacionId As Integer = dgvPresentaciones.SelectedRows(0).Cells("PresentacionId").Value
            Dim ObraSocialXPlanId As Integer

            'Si la presentación esta pendiente de auditoría
            If PresentacionPendienteAuditoria(PresentacionId) Then

                'Si la obra social de la presentación admite detalle
                If ObraSocialAdmiteDetalle(PresentacionId) Then


                    ActualizarAuditorPresentacion(PresentacionId)

                    frmListadoRecetas.txtFarmacia.Text = dgvPresentaciones.SelectedRows(0).Cells("FarmaciaNombre").Value
                    frmListadoRecetas.txtOS.Text = dgvPresentaciones.SelectedRows(0).Cells("Descripcion").Value
                    frmListadoRecetas.txtAno.Text = dgvPresentaciones.SelectedRows(0).Cells("PresentacionAno").Value
                    frmListadoRecetas.txtMes.Text = dgvPresentaciones.SelectedRows(0).Cells("MesNombre").Value

                    frmListadoRecetas.FarmaciaId = FarmaciaId
                    ObraSocialXPlanId = PresentacionDAO.obtenerPresentaciones(PresentacionId).Rows(0)("ObraSocialXPlanId")
                    frmListadoRecetas.ObraSocialXPlanId = ObraSocialXPlanId
                    frmListadoRecetas.PresentacionId = PresentacionId

                    Me.Visible = False
                    'Muestro el formulario
                    frmListadoRecetas.ShowDialog()



                Else
                    MsgBox("La obra social de la presentación no admite detalle", MsgBoxStyle.Information, "Atención")
                End If
            Else
                MsgBox("No pueden cargarse recetas, la presentación ya fue cerrada", MsgBoxStyle.Information, "Atención")
            End If
        Else
            MsgBox("Seleccione primero una presentación", MsgBoxStyle.Information, "Atención")
        End If

    End Sub

    Private Sub ActualizarAuditorPresentacion(ByVal PresentacionId As Integer)

        Dim dt As DataTable = PresentacionDAO.obtenerPresentaciones(PresentacionId)

        Dim PresentacionFecha As Date = dt.Rows(0)("PresentacionFecha")
        Dim PresentacionAno As Integer = dt.Rows(0)("PresentacionAno")
        Dim MesId As Integer = dt.Rows(0)("MesId")
        Dim EstadoPresentacionId As Integer = dt.Rows(0)("EstadoPresentacionId")
        Dim FarmaciaId As Integer = dt.Rows(0)("FarmaciaId")
        Dim ObraSocialXPlan As Integer = dt.Rows(0)("ObraSocialXPlanId")
        Dim EmpleadoRecepcionId As Integer = dt.Rows(0)("EmpleadoRecepcionId")

        'TODO ********Valor hardcodeado en el futuro corregir************
        'Dim EmpleadoAuditorId As Integer = 1

        'Metemos los datos del auditor en la presentacion
        PresentacionDAO.actualizarPresentacion(PresentacionId, PresentacionFecha, PresentacionAno, MesId, EstadoPresentacionId, FarmaciaId, ObraSocialXPlan, EmpleadoRecepcionId)

    End Sub

    Private Function PresentacionPendienteAuditoria(ByVal PresentacionId As Integer) As Boolean
        Dim EstadoPresentacionId As Integer = PresentacionDAO.obtenerPresentaciones(PresentacionId).Rows(0)("EstadoPresentacionId")
        Dim PendienteAuditoria As Boolean = False

        'Pendiente de auditoría
        If EstadoPresentacionId = EstadoPresentacionDAO.PENDIENTE_AUDITORIA Then
            PendienteAuditoria = True
        End If

        Return PendienteAuditoria
    End Function

    Private Function PresentacionCerrada(ByVal PresentacionId As Integer) As Boolean
        Dim EstadoPresentacionId As Integer = PresentacionDAO.obtenerPresentaciones(PresentacionId).Rows(0)("EstadoPresentacionId")
        Dim Cerrada As Boolean = False

        'Cerrada
        If EstadoPresentacionId = EstadoPresentacionDAO.CERRADA Then
            Cerrada = True
        End If

        Return Cerrada
    End Function

    Private Function ObraSocialAdmiteDetalle(ByVal PresentacionId As Integer) As Boolean
        Dim ObraSocialXPlanId As Integer = PresentacionDAO.obtenerPresentaciones(PresentacionId).Rows(0)("ObraSocialXPlanId")
        Dim admite As Boolean = False

        If ObraSocialXPlanDAO.obtenerObrasSocialesXPlanes(ObraSocialXPlanId).Rows(0)("ObraSocialXPlanLlevaDetalle") Then
            admite = True
        End If

        Return admite
    End Function


End Class